package com.xwtec.juc.c_000;

import java.util.concurrent.TimeUnit;

/**
 * @Author: zt
 * @Date: 2021/3/19 14:12
 */
public class T03_Sleep_Yield_Join {


    //线程中的sleep方法：比如我这个线程睡500mm，在这500mm中cpu不能调用这条线程执行 .sleep结束之后会进入就绪状态
    static void testSleep(){
        new Thread(()->{
            for (int i = 0; i <100 ; i++) {
                System.out.println("A"+i);
                try {
                    TimeUnit.MILLISECONDS.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }


    //yield方法，指的是当前正在cpu执行的线程重新回到等待队列中等待cpu的调用（cpu可能还会调用他）
    static void testYield(){
        new Thread(()->{
            for (int i = 0; i <100 ; i++) {
                System.out.println("A"+i);
                if(i%10 ==0) Thread.yield();
            }
        }).start();

        new Thread(()->{
            for (int i = 0; i <100 ; i++) {
                System.out.println("B"+i);
                if(i%10 ==0) Thread.yield();
            }
        }).start();

    }


    //join 方法：线程t2在执行，t1加入进来，t2要等t1执行完才能执行（线程同步的思想，比如说如何让3个线程按顺序执行，就可以使用join方法）
    static void testJoin(){
        Thread t1=new Thread(()->{
            for (int i = 0; i <100 ; i++) {
                System.out.println("A"+i);

                try {
                    TimeUnit.MILLISECONDS.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        Thread t2=new Thread(()->{
            try {
                t1.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });


    }
}
